Проба БПФ
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы
 
 glagol.png Программируем по-русски
 

Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку.

Издатель Глагола
 

 

(******************************************************************************)
(**)                        ОТДЕЛ ПроБПФ+;
(******************************************************************************
 * НАЗНАЧЕНИЕ: 
 *   сравнение вычисления быстрого преобразования Фурье (БПФ) и
 *   вычисления обычного ПФ
 * ПРИМЕЧАНИЯ: 
 *   1) во временной области формируем сигнал, состоящий из 200Гц синусоиды
 *      и небольной по амплитуде 2000Гц косинусоиды;
 *   2) выполняем БПФ;
 *   3) удаляем частотные составляющие выше 1000Гц;
 *   4) выполняем обратное БПФ;
 *   5) сравниваем БПФ и ПФ.
 ******************************************************************************)
ИСПОЛЬЗУЕТ 
  Матем     ИЗ "...\Отделы\Числа\",
  Компл     ИЗ "...\Отделы\Числа\",
  КомплВект ИЗ "...\Отделы\Числа\",
  МатрВВ    ИЗ "...\Отделы\Числа\",
  Вывод     ИЗ "...\Отделы\Обмен\";

ПОСТ
  Отсчетов = 512;       (* всего отсчетов сигнала (должно быть степенью 2) *)
  Дискретизация = 22050;(* частота дискретизации, Гц *)

ВИД
  Вещ = Матем.Вещ;

(******************************************************************************)
ЗАДАЧА f(t:Вещ):Вещ;     (* сигнал в определенный момент времени *)
УКАЗ
  ВОЗВРАТ Матем.sin(200*Матем.ПИ2*t) + 0.2*Матем.cos(2000*Матем.ПИ2*t)
КОН f;

(******************************************************************************)
ЗАДАЧА Голова;
ПЕР
  i,частота:ЦЕЛ;
  t,dt:Вещ;
  вых:Компл.Вид;
  вход,выход:КомплВект.Доступ;
УКАЗ
  СОЗДАТЬ(вход, Отсчетов);
  СОЗДАТЬ(выход,Отсчетов);

  t:=0;
  dt:=1/Дискретизация;
  ОТ i:=0 ДО Отсчетов-1 ВЫП
    Компл.алгВид(f(t),0,вход[i]);
    t:=t+dt
  КОН;

  Вывод.Цепь("^Временной ряд на входе БПФ^");
  МатрВВ.ВыводКомплВект("(%11.3e;%11.3e)^",вход^);
  КомплВект.БПФ(вход^,выход^);
  Вывод.Цепь("^Частотный ряд после БПФ^");
  МатрВВ.ВыводКомплВект("(%11.3e;%11.3e)^",выход^);

  (* убираем все частоты выше 1000 Гц *)
  частота:=УЗК(ВШИРЦЕЛ(1000*Отсчетов/Дискретизация));
  ОТ i:=0 ДО Отсчетов-1 ВЫП
    ЕСЛИ ((i > частота) И (i < (Отсчетов ДЕЛИТЬ 2)))
        ИЛИ
         ((i >= (Отсчетов ДЕЛИТЬ 2)) И (i < Отсчетов-частота))
    ТО
        выход[i]:=Компл.НОЛЬ
    КОН
  КОН;

  КомплВект.ОБПФ(выход^,вход^);
  Вывод.Цепь("^Временной ряд после фильтрации^");
  МатрВВ.ВыводКомплВект("(%11.3e;%11.3e)^",вход^);

  Вывод.Цепь("^Сравнение БПФ и ПФ^");
  (* заполняем <вход> случайным образом *)
  ОТ i:=0 ДО Отсчетов-1 ВЫП
    Компл.алгВид(Матем.случ()*10000,
                 Матем.случ()*10000,вход[i])
  КОН;
                          (* вычисление через БПФ *)
  КомплВект.БПФ(вход^,выход^);
  ОТ i:=0 ДО Отсчетов-1 ВЫП
                          (* вычисление через ПФ по определению *)
    КомплВект.ПФ(i,вход^,вых);
                          (* сравнение результатов БПФ и ПФ *)
    Вывод.ЧВещ("%14.5f %14.5f  %14.5f %14.5f^",выход[i].x, вых.x,
                                         выход[i].y, вых.y)
  КОН
КОН Голова;

(******************************************************************************)
УКАЗ
  Голова
КОН ПроБПФ.




Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
 email
 
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы